package com.xxl.job.executor.utils;


import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.DecimalFormat;

public class CRCUtil {
    static final String HEXES = "0123456789ABCDEF";
    byte uchCRCHi = (byte) 0xFF;
    byte uchCRCLo = (byte) 0xFF;
    private static byte[] auchCRCHi = { 0x00, (byte) 0xC1, (byte) 0x81,
            (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
            (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00,
            (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81,
            (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40,
            (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01,
            (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81,
            (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
            (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01,
            (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81,
            (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
            (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00,
            (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81,
            (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
            (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00,
            (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80,
            (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
            (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01,
            (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81,
            (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
            (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00,
            (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80,
            (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40,
            (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01,
            (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81,
            (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
            (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00,
            (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81,
            (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40,
            (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00,
            (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80,
            (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40,
            (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00,
            (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1,
            (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80,
            (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
            (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00,
            (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0,
            (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81,
            (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41,
            (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00,
            (byte) 0xC1, (byte) 0x81, (byte) 0x40 };

    private static byte[] auchCRCLo = { (byte) 0x00, (byte) 0xC0, (byte) 0xC1,
            (byte) 0x01, (byte) 0xC3, (byte) 0x03, (byte) 0x02, (byte) 0xC2,
            (byte) 0xC6, (byte) 0x06, (byte) 0x07, (byte) 0xC7, (byte) 0x05,
            (byte) 0xC5, (byte) 0xC4, (byte) 0x04, (byte) 0xCC, (byte) 0x0C,
            (byte) 0x0D, (byte) 0xCD, (byte) 0x0F, (byte) 0xCF, (byte) 0xCE,
            (byte) 0x0E, (byte) 0x0A, (byte) 0xCA, (byte) 0xCB, (byte) 0x0B,
            (byte) 0xC9, (byte) 0x09, (byte) 0x08, (byte) 0xC8, (byte) 0xD8,
            (byte) 0x18, (byte) 0x19, (byte) 0xD9, (byte) 0x1B, (byte) 0xDB,
            (byte) 0xDA, (byte) 0x1A, (byte) 0x1E, (byte) 0xDE, (byte) 0xDF,
            (byte) 0x1F, (byte) 0xDD, (byte) 0x1D, (byte) 0x1C, (byte) 0xDC,
            (byte) 0x14, (byte) 0xD4, (byte) 0xD5, (byte) 0x15, (byte) 0xD7,
            (byte) 0x17, (byte) 0x16, (byte) 0xD6, (byte) 0xD2, (byte) 0x12,
            (byte) 0x13, (byte) 0xD3, (byte) 0x11, (byte) 0xD1, (byte) 0xD0,
            (byte) 0x10, (byte) 0xF0, (byte) 0x30, (byte) 0x31, (byte) 0xF1,
            (byte) 0x33, (byte) 0xF3, (byte) 0xF2, (byte) 0x32, (byte) 0x36,
            (byte) 0xF6, (byte) 0xF7, (byte) 0x37, (byte) 0xF5, (byte) 0x35,
            (byte) 0x34, (byte) 0xF4, (byte) 0x3C, (byte) 0xFC, (byte) 0xFD,
            (byte) 0x3D, (byte) 0xFF, (byte) 0x3F, (byte) 0x3E, (byte) 0xFE,
            (byte) 0xFA, (byte) 0x3A, (byte) 0x3B, (byte) 0xFB, (byte) 0x39,
            (byte) 0xF9, (byte) 0xF8, (byte) 0x38, (byte) 0x28, (byte) 0xE8,
            (byte) 0xE9, (byte) 0x29, (byte) 0xEB, (byte) 0x2B, (byte) 0x2A,
            (byte) 0xEA, (byte) 0xEE, (byte) 0x2E, (byte) 0x2F, (byte) 0xEF,
            (byte) 0x2D, (byte) 0xED, (byte) 0xEC, (byte) 0x2C, (byte) 0xE4,
            (byte) 0x24, (byte) 0x25, (byte) 0xE5, (byte) 0x27, (byte) 0xE7,
            (byte) 0xE6, (byte) 0x26, (byte) 0x22, (byte) 0xE2, (byte) 0xE3,
            (byte) 0x23, (byte) 0xE1, (byte) 0x21, (byte) 0x20, (byte) 0xE0,
            (byte) 0xA0, (byte) 0x60, (byte) 0x61, (byte) 0xA1, (byte) 0x63,
            (byte) 0xA3, (byte) 0xA2, (byte) 0x62, (byte) 0x66, (byte) 0xA6,
            (byte) 0xA7, (byte) 0x67, (byte) 0xA5, (byte) 0x65, (byte) 0x64,
            (byte) 0xA4, (byte) 0x6C, (byte) 0xAC, (byte) 0xAD, (byte) 0x6D,
            (byte) 0xAF, (byte) 0x6F, (byte) 0x6E, (byte) 0xAE, (byte) 0xAA,
            (byte) 0x6A, (byte) 0x6B, (byte) 0xAB, (byte) 0x69, (byte) 0xA9,
            (byte) 0xA8, (byte) 0x68, (byte) 0x78, (byte) 0xB8, (byte) 0xB9,
            (byte) 0x79, (byte) 0xBB, (byte) 0x7B, (byte) 0x7A, (byte) 0xBA,
            (byte) 0xBE, (byte) 0x7E, (byte) 0x7F, (byte) 0xBF, (byte) 0x7D,
            (byte) 0xBD, (byte) 0xBC, (byte) 0x7C, (byte) 0xB4, (byte) 0x74,
            (byte) 0x75, (byte) 0xB5, (byte) 0x77, (byte) 0xB7, (byte) 0xB6,
            (byte) 0x76, (byte) 0x72, (byte) 0xB2, (byte) 0xB3, (byte) 0x73,
            (byte) 0xB1, (byte) 0x71, (byte) 0x70, (byte) 0xB0, (byte) 0x50,
            (byte) 0x90, (byte) 0x91, (byte) 0x51, (byte) 0x93, (byte) 0x53,
            (byte) 0x52, (byte) 0x92, (byte) 0x96, (byte) 0x56, (byte) 0x57,
            (byte) 0x97, (byte) 0x55, (byte) 0x95, (byte) 0x94, (byte) 0x54,
            (byte) 0x9C, (byte) 0x5C, (byte) 0x5D, (byte) 0x9D, (byte) 0x5F,
            (byte) 0x9F, (byte) 0x9E, (byte) 0x5E, (byte) 0x5A, (byte) 0x9A,
            (byte) 0x9B, (byte) 0x5B, (byte) 0x99, (byte) 0x59, (byte) 0x58,
            (byte) 0x98, (byte) 0x88, (byte) 0x48, (byte) 0x49, (byte) 0x89,
            (byte) 0x4B, (byte) 0x8B, (byte) 0x8A, (byte) 0x4A, (byte) 0x4E,
            (byte) 0x8E, (byte) 0x8F, (byte) 0x4F, (byte) 0x8D, (byte) 0x4D,
            (byte) 0x4C, (byte) 0x8C, (byte) 0x44, (byte) 0x84, (byte) 0x85,
            (byte) 0x45, (byte) 0x87, (byte) 0x47, (byte) 0x46, (byte) 0x86,
            (byte) 0x82, (byte) 0x42, (byte) 0x43, (byte) 0x83, (byte) 0x41,
            (byte) 0x81, (byte) 0x80, (byte) 0x40 };

    public int value;

    public CRCUtil() {
        value = 0;

    }

    // ASCII码转CRC16编码
    public static String ascii2crc16(String msg){
        StringBuilder stringBuilder=new StringBuilder();
        // 获取ASCII码16进制值
        char[] data=msg.toCharArray();
        for(int i=0;i<data.length;i++){
            stringBuilder.append(Integer.toHexString((int)data[i]));
        }
        stringBuilder.append("17");
        // ASCII码16进制值转CRC16编码
        String crc16code=getCRC(stringBuilder.toString());
        String begin=crc16code.substring(2,4);
        String end=crc16code.substring(0,2);
        return begin+end;
    }
    // ASCII码转CRC16编码
    public static String str2ascii(String msg){
        StringBuilder stringBuilder=new StringBuilder();

        // 切割字符串
        String[] msgArr=msg.replace("<STX>","<H>").replace("<ETB>","<H>").replace("<ETX>","<H>").split("<H>");

        String head=msgArr[0];
        String body=msgArr[1];
        String crc=msgArr[2];

        // 处理头信息
        if("".equals(head)){
            stringBuilder.append("02"); //STX
        }else{
            // 将字符转换为16进制数
            char[] data=head.toCharArray();
            for(int i=0;i<data.length;i++){
                stringBuilder.append(Integer.toHexString((int)data[i]));
            }
            stringBuilder.append("02"); //STX
        }

        // 处理消息体
        char[] bodyData=body.toCharArray();
        for(int i=0;i<bodyData.length;i++){
            stringBuilder.append(Integer.toHexString((int)bodyData[i]));
        }
        stringBuilder.append("17"); //ETB

        // 处理crc码
        char[] crcData=crc.toCharArray();
        for(int i=0;i<crcData.length;i++){
            stringBuilder.append(Integer.toHexString((int)crcData[i]));
        }
        stringBuilder.append("03"); //ETX

        return stringBuilder.toString().toUpperCase();
    }

    // ASCII编码转字符串
    public static String ascii2str(String acciiStr){
        String[] strArr=new String[acciiStr.length()/2];
        byte[] byteArr=new byte[acciiStr.length()/2];

        int j=0;
        for(int i=0;i<acciiStr.length();i++){
            if(i%2==0){//每隔bai两个
                strArr[j]=""+acciiStr.charAt(i);
            }else{
                strArr[j]=strArr[j]+""+acciiStr.charAt(i);//将字符加上两个空格du
                j++;
            }
        }

        StringBuilder stringBuilder=new StringBuilder();
        for(int i=0;i<strArr.length;i++){
            byte b = (byte) (0xff & Integer.parseInt(strArr[i], 16));
            System.out.println(b);
            // <STX>
            if(b==0x02){
                stringBuilder.append("<STX>");
            }
            // <ETB>
            else if(b==0x17){
                stringBuilder.append("<ETB>");
            }
            // <ETX>
            else if(b==0x03){
                stringBuilder.append("<ETX>");
            }else{
                stringBuilder.append((char)b);
            }
        }

        return stringBuilder.toString();
    }

    public void update(byte[] puchMsg, int usDataLen) {

        int uIndex;
        // int i = 0;
        for (int i = 0; i < usDataLen; i++) {
            uIndex = (uchCRCHi ^ puchMsg[i]) & 0xff;

            uchCRCHi = (byte) (uchCRCLo ^ auchCRCHi[uIndex]);
            uchCRCLo = auchCRCLo[uIndex];
        }
        value = ((((int) uchCRCHi) << 8 | (((int) uchCRCLo) & 0xff))) & 0xffff;

        return;
    }

    public void reset() {
        value = 0;
        uchCRCHi = (byte) 0xff;
        uchCRCLo = (byte) 0xff;
    }

    public int getValue() {
        return value;
    }

    private static byte uniteBytes(byte src0, byte src1) {
        byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 }))
                .byteValue();
        _b0 = (byte) (_b0 << 4);
        byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 }))
                .byteValue();
        byte ret = (byte) (_b0 ^ _b1);
        return ret;
    }

    private static byte[] HexString2Buf(String src) {
        int len = src.length();
        byte[] ret = new byte[len / 2+2];
        byte[] tmp = src.getBytes();
        for (int i = 0; i < len; i += 2) {
            ret[i / 2] = uniteBytes(tmp[i], tmp[i + 1]);
        }
        return ret;
    }

    public static byte[] getSendBuf(String toSend){
        byte[] bb = HexString2Buf(toSend);
        CRCUtil crc16 = new CRCUtil();
        crc16.update(bb, bb.length-2);
        int ri = crc16.getValue();
        bb[bb.length-1]=(byte) (0xff & ri);
        bb[bb.length-2]=(byte) ((0xff00 & ri) >> 8);
        return bb;
    }
    public static boolean checkBuf(byte[] bb){
        CRCUtil crc16 = new CRCUtil();
        crc16.update(bb, bb.length-2);
        int ri = crc16.getValue();
        if(bb[bb.length-1]==(byte)(ri&0xff)
                && bb[bb.length-2]==(byte) ((0xff00 & ri) >> 8))
            return true;
        return false;
    }
    public static String getBufHexStr(byte[] raw){
        if ( raw == null ) {
            return null;
        }
        final StringBuilder hex = new StringBuilder( 2 * raw.length );
        for ( final byte b : raw ) {
            hex.append(HEXES.charAt((b & 0xF0) >> 4))
                    .append(HEXES.charAt((b & 0x0F)));
        }
        return hex.toString();
    }

    /**
     * 计算CRC16校验码
     *
     * @param data 需要校验的字符串
     * @return 校验码
     */
    public static String getCRC(String data) {
        data = data.replace(" ", "");
        int len = data.length();
        if (!(len % 2 == 0)) {
            return "0000";
        }
        int num = len / 2;
        byte[] para = new byte[num];
        for (int i = 0; i < num; i++) {
            int value = Integer.valueOf(data.substring(i * 2, 2 * (i + 1)), 16);
            para[i] = (byte) value;
        }
        return getCRC(para);
    }

    /**
     * 计算CRC16校验码
     *
     * @param bytes 字节数组
     * @return {@link String} 校验码
     * @since 1.0
     */
    public static String getCRC(byte[] bytes) {
        //CRC寄存器全为1
        int CRC = 0x0000ffff;
        //多项式校验值
        int POLYNOMIAL = 0x0000a001;
        int i, j;
        for (i = 0; i < bytes.length; i++) {
            CRC ^= ((int) bytes[i] & 0x000000ff);
            for (j = 0; j < 8; j++) {
                if ((CRC & 0x00000001) != 0) {
                    CRC >>= 1;
                    CRC ^= POLYNOMIAL;
                } else {
                    CRC >>= 1;
                }
            }
        }
        //结果转换为16进制
        String result = Integer.toHexString(CRC).toUpperCase();
        if (result.length() != 4) {
            StringBuffer sb = new StringBuffer("0000");
            result = sb.replace(4 - result.length(), 4, result).toString();
        }
        //交换高低位
        return result.substring(2, 4) + result.substring(0, 2);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
//        String hexdata ="404004000102292B101A081301000000000085481BBE2C00300002020101010049460F00030800000000000000000000000000000000000000000000000000000000000000000D110C0513952323";
//        String substr = hexdata.substring(4,hexdata.length()-6);//控制单元中各字节数据(第3～27字节)及应用数据单元数据
//        String checkSum = TransUtils.hexString2binaryString("80");//校验和(1字节)
////        String sum= TransUtils.makeChecksums(substr);
//            String  str = getSendBufStr("06173030");
//            System.out.println(TransUtils.intToHex4("5"));
//            String msg="<STX>04LCL<ETB>A527<ETX>";
//            System.out.println(str2ascii(msg));
//
//            String code="0230344C434C174135323703";
//            System.out.println(ascii2str(code));
        //首先，把double转换为二进制
        float number= Float.parseFloat("3.45f");
        int f = Float.floatToIntBits(number);
        String number2=Integer.toBinaryString(f);
        System.out.println(number2);

        //补位
        number2=addZeroForNum(number2, 32);
        System.out.println(number2);

        //每8位分割
        StringBuilder stringBuilder=new StringBuilder();
        for(int i=0;i<number2.length();i++){
            if(i%8==0 && i!=0){//每隔bai两个
                stringBuilder.append(" ").append(number2.charAt(i));
            }else{
                stringBuilder.append(number2.charAt(i));
            }
        }

        System.out.println(stringBuilder.toString());

        String code=stringBuilder.toString();
        String[] strs = code.split ("\\s+");
        String result = "";
        for ( String string : strs )
        {
            String hex = Integer.toString (Integer.parseInt (string, 2), 16);
            if(hex.length()<2){
                hex="0"+hex;
            }
            result +=hex;
        }
        System.out.println (result);
    }

    /**
     * @param bufStr
     */
    public static String getSendBufStr(String bufStr) {
        // TODO Auto-generated method stub
        byte[] sbuf = CRCUtil.getSendBuf(bufStr);
       String sendBufStr = CRCUtil.getBufHexStr(sbuf);
       return sendBufStr;
    }


    /**
     * modbus 返回的四字节的浮点数转换<br>
     * hexstr = "AE 14 41 43";原始串
     */
    public static Double getDoubleByHexstr(String hexstr) {
        //String[] hexarray = hexstr.split(", ");
        // 高地位互换
        //hexstr = hexarray[2] + hexarray[3] + hexarray[0] + hexarray[1];
        hexstr=hexstr.substring(4, 6)+hexstr.substring(6, 8)+hexstr.substring(0, 2)+hexstr.substring(2, 4);
       // System.out.println(hexstr);
        // System.out.println( hexstr );
        // 先将16进制数转成二进制数0 10000001 00000000000000000000000 <br>
        String binarystr = hexString2binaryString(hexstr);
        // 1位符号位(SIGN)=0 表示正数
        String sign = binarystr.substring(0, 1);
        // 8位指数位(EXPONENT)=10000001=129[10进制]
        String exponent = binarystr.substring(1, 9);
        int expint = Integer.parseInt(exponent, 2);
        // 23位尾数位(MANTISSA)=00000000000000000000000
        String last = binarystr.substring(9);
        // 小数点移动位数
        int mobit = expint - 127;
        // 小数点右移18位后得10101001 01101001 110.00000
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 23; i++) {
            if (i == mobit)
                sb.append(".");
            char b = last.charAt(i);
            sb.append(b);

        }
        String valstr = "1" + sb.toString();
        int s = valstr.indexOf(".") - 1;// 指数
        Double dval = 0d;
        for (int i = 0; i < valstr.length(); i++) {
            if (valstr.charAt(i) == '.')
                continue;

            Double d = Math.pow(2, s);
            int f = Integer.valueOf(valstr.charAt(i) + "");
            // System.out.println( f );
            d = d * f;
            // System.out.println( "c:=" + valstr.charAt( i ) + ",s=" + s +
            // ",val=" + d + ", Math.pow( 2, s )=" + Math.pow( 2, s ) );
            s = s - 1;
            dval = dval + d;
        }
        if (sign.equals("1"))
            dval = 0 - dval;
        return round(dval);
    }

    public static String hexString2binaryString(String hexString) {
        if (hexString == null || hexString.length() % 2 != 0)
            return null;
        String bString = "", tmp;
        for (int i = 0; i < hexString.length(); i++) {
            tmp = "0000" + Integer.toBinaryString(Integer.parseInt(hexString.substring(i, i + 1), 16));
            bString += tmp.substring(tmp.length() - 4);
        }
        return bString;
    }

    public static Double round(double dt){
        DecimalFormat df=new DecimalFormat(".####");
        String strdt=df.format(dt);
        return Double.parseDouble(strdt);
    }

    /**
     * 字符串转换为16进制byte数组
     * @param value
     * @return
     */
    public static byte[] stringTo16ByteArr(String value){
        String acciiStr=ascii2crc16(value);
        acciiStr=acciiStr.replace(" ","");
        String[] strArr=new String[acciiStr.length()/2];
        byte[] byteArr=new byte[acciiStr.length()/2];

        int j=0;
        for(int i=0;i<acciiStr.length();i++){
            if(i%2==0){//每隔bai两个
                strArr[j]=""+acciiStr.charAt(i);
            }else{
                strArr[j]=strArr[j]+""+acciiStr.charAt(i);//将字符加上两个空格du
                j++;
            }
        }

        StringBuilder stringBuilder=new StringBuilder();
        for(int i=0;i<strArr.length;i++){
            byte b = (byte) (0xff & Integer.parseInt(strArr[i], 16));
            // <STX>
            if(b==0x02){
                stringBuilder.append("<STX>");
            }
            // <ETB>
            else if(b==0x17){
                stringBuilder.append("<ETB>");
            }
            // <ETX>
            else if(b==0x03){
                stringBuilder.append("<ETX>");
            }else{
                stringBuilder.append((char)b);
            }
            byteArr[i]=b;
        }

        return byteArr;
    }

    public static String ascii2crc16_2(String msg){
        StringBuilder stringBuilder=new StringBuilder();
        String[] msgArr=msg.split("<ETB>");
        String crcData=msgArr[0];

        char[] crcChar=crcData.toCharArray();
        for(int i=0;i<crcChar.length;i++){
            stringBuilder.append(Integer.toHexString((int)crcChar[i]));
        }

        stringBuilder.append("17");

        return stringBuilder.toString();
    }

    public static String addZeroForNum(String str, int strLength) {
        int strLen = str.length();
        StringBuffer sb = null;
        while (strLen < strLength) {
            sb = new StringBuffer();
            sb.append("0").append(str);// 左补0
            // sb.append(str).append("0");//右补0
            str = sb.toString();
            strLen = str.length();
        }
        return str;
    }
}

